package com.itzzj.common.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * jwt 工具类
 */
@Component
public class JwtUtil {

    @Value("${jwt.secret}")
    private String secret;

    @Value("${jwt.expiration}")
    private Long expiration;

    /**
     * 创建 token
     * @param username 用户名
     * @return
     */
    public String generateToken(String username){
        return Jwts.builder()
                // 设置签名，使用的加密算法
                .signWith(SignatureAlgorithm.HS256,secret)
                // 设置主体，可以是 JSON数据
                .setSubject(username)
                // 设置签发日期
                .setIssuedAt(new Date())
                // 设置到期时间，System.currentTimeMillis() 相当于毫秒为单位
                .setExpiration(new Date(System.currentTimeMillis() + expiration * 1000))
                .compact();
    }

    /**
     * 获取token中的用户名
     * @param token
     * @return
     */
    public String getUserNameFromToken(String token){
        return getTokenBody(token).getSubject();
    }

    /**
     * 判断 token 是否过期
     * @param token
     * @return true 代表已经过期
     */
    public boolean isExpiration(String token){
        // 当 token 中的过期时间小于 new Date() 返回 true
        return getTokenBody(token).getExpiration().before(new Date());
    }

    /**
     * 获取token中的信息
     * @param token
     * @return
     */
    private Claims getTokenBody(String token){
        Claims claims = null;
        try {
             claims = Jwts.parser().setSigningKey(secret)
                    .parseClaimsJws(token).getBody();
        }catch (ExpiredJwtException e){
            // token 已经过期
            claims = e.getClaims();
        }
        return claims;
    }

    public static void main(String[] args) {
        SimpleDateFormat format = new SimpleDateFormat();
        System.out.println(new Date(System.currentTimeMillis() + 3600 * 1000));
        String date = format.format(new Date(System.currentTimeMillis() + 3600 * 1000));
        System.out.println(date);
    }

}




















































